package com.example.fw;

import static org.junit.Assert.fail;

import java.util.Properties;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;

public class ApplicationManager {

	private StringBuffer verificationErrors = new StringBuffer();
	private WebDriver driver;
	public String baseUrl;
	private NavigationHelper navigationHelper;
	private GroupHelper groupHelper;
	private ContactHelper contactHelper;
	private DateHelper dateHelper;
	private Properties properties;
	private HibernateHelper hibernateHelper;
	private ApplicationModel model;
	
	
	public ApplicationManager(Properties properties){
	    this.properties = properties;
	}

	public void stop() {
	    driver.quit();
	    String verificationErrorString = verificationErrors.toString();
	    if (!"".equals(verificationErrorString)) {
	      fail(verificationErrorString);
	    }		
	}
	
	public ApplicationModel getModel(){
		if (model == null){
          model = new ApplicationModel(this);
        }
        return model;
	}
	
	public NavigationHelper navigateTo(){
		if (navigationHelper == null){
			navigationHelper = new NavigationHelper(this);
		}
		return navigationHelper;
	}
	
	 public GroupHelper getGroupHelper(){
		if (groupHelper == null){
			groupHelper = new GroupHelper(this);
		}
		return groupHelper;
	}
	 
	 public ContactHelper getContactHelper(){
		if (contactHelper == null){
			contactHelper = new ContactHelper(this);
		}
		return contactHelper;
	}
	 
	 public DateHelper getDateHelper(){
		if (dateHelper == null){
			dateHelper = new DateHelper(this);
		}
		return dateHelper;
	}

	public WebDriver getDriver() {
		if (driver == null){
		    String browser = properties.getProperty("browser");
		    if ("firefox".equals(browser)){
				driver = new FirefoxDriver();
			    }  else if ("ie".equals(browser)){
				driver = new InternetExplorerDriver();
			    } else {
			    	throw new Error("Unsuported browser: " + browser);
			    }	   
			    String baseUrl = properties.getProperty("baseUrl");
			    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
			    driver.get(baseUrl);
		}
		return driver;
	}

	public HibernateHelper getHibernateHelper() {
		if (hibernateHelper == null){
			hibernateHelper = new HibernateHelper(this);
		}
		return hibernateHelper;
		
	}
	
	public String getProperty(String key){
		return properties.getProperty(key);
	}
}
